import axios from 'axios'
import { Toast } from 'antd-mobile'
import router from '../router'

const instance = axios.create({
  // 项目运行的地址
  // 如果线上接口开启了 CORS 跨域访问，大家直接把接口地址放到 baseURL 即可，无需配置 proxy 代理
  // 如果线上接口没有开启 CORS 跨域访问，那么 baseURL 就只能填 http://localhost:517X，并且还需要在 vite.config.js 中配置 server.proxy 代理
  baseURL: 'http://localhost:5173',
  // 实际开发中，timeout 都会比较长
  timeout: 10000
})

// 拦截器
// 请求拦截器
instance.interceptors.request.use(
  function (config) {
    // Do something before request is sent
    // 挂载 token 到请求头的 Authorization 字段中
    if (config.url.includes('/login') || config.url.includes('/register')) {
      // 不需要携带token
    } else {
      // 需要携带 token
      config.headers['Authorization'] = localStorage.getItem('token')
    }

    Toast.show({
      icon: 'loading',
      content: '加载中…',
      duration: 0
    })
    return config
  },
  function (error) {
    // Do something with request error
    return Promise.reject(error)
  }
)

// 响应拦截器
instance.interceptors.response.use(
  // 响应成功的时候，才被触发（如果响应状态码是 2xx，则触发它）
  function (response) {
    // Any status code that lie within the range of 2xx cause this function to trigger
    // Do something with response data
    console.log('响应的数据，流经了第1个 function 函数')
    Toast.clear()
    return response.data
  },
  // 响应失败的时候，才被触发（如果响应状态码不是 2xx，则触发它）
  function (error) {
    // Any status codes that falls outside the range of 2xx cause this function to trigger
    // Do something with response error
    console.log('响应的数据，流经了第2个 function 函数')
    Toast.clear()

    if (error.response) {
      // console.log(error.response.data.message)
      Toast.show(error.response.data.message)
    }

    switch (error.status?.toString()[0]) {
      case '3':
        console.log('3开头的错误')
        break
      case '4':
        console.log('4开头的错误')
        if (error.status === 401) {
          // token 鉴权失败
          // 1. 清空本地 token
          localStorage.removeItem('token')
          // 2. 提示用户登录过期
          Toast.show('登录过期，请重新登录！')
          // 3. 强制用户去登录页面
          // nav('/login') // 不能这么办，因为当前的 request.js 不是函数式组件，无法调用 Hook
          router.navigate('/login')
        }
        break
      case '5':
        console.log('5开头的错误')
        break
      default:
        console.log('其它的错误')
        break
    }

    return Promise.reject(error)
  }
)

export default instance
